# 安装依赖库
#!pip install pandas openpyxl matplotlib seaborn

# 导入工具包
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Songti SC']  # 根据系统可用字体调整
plt.rcParams['axes.unicode_minus'] = False  # 解决负号乱码

# 读取Excel中的Sheet3（账单数据）
df = pd.read_excel("/Users/jijiuxue/Downloads/数据分析.xlsx", sheet_name="Sheet3")

# 数据清洗
def preprocess_data(df):
    # 处理"收/支"列的斜杠问题
    df["收/支"] = df["收/支"].replace("/", "其他")
    # 转换时间列为datetime类型
    df["交易时间"] = pd.to_datetime(df["交易时间"])
    # 提取日期特征
    df["日期"] = df["交易时间"].dt.date
    df["月份"] = df["交易时间"].dt.month
    df["小时"] = df["交易时间"].dt.hour
    # 标记是否为周末
    df["是否周末"] = df["交易时间"].dt.weekday >= 5
    return df

df = preprocess_data(df)


# 定义分类规则
def classify_transaction(row):
    amount = row["金额(元)"]
    description = row["当前状态"]
    
    # 收入分类
    if row["收/支"] == "收入":
        if "退款" in description:
            return "退款收入"
        elif "零钱" in description:
            return "零钱存入"
        else:
            return "其他收入"
    
    # 支出分类
    elif row["收/支"] == "支出":
        if "转账" in description:
            return "账户转账"
        elif amount <= 6:
            return "小额消费"
        elif 6 < amount <= 100:
            return "日常消费"
        elif 100 < amount <= 500:
            return "中等支出"
        else:
            return "大额支出"
    
    # 其他类型
    else:
        return "其他"

# 应用分类
df["支出类型"] = df.apply(classify_transaction, axis=1)

# 计算关键指标
total_income = df[df["收/支"] == "收入"]["金额(元)"].sum()
total_expense = df[df["收/支"] == "支出"]["金额(元)"].sum()
net_cashflow = total_income - total_expense

# 分类统计
category_stats = df.groupby("支出类型")["金额(元)"].agg(["sum", "count"])


# 支出分类占比（饼图）
plt.figure(figsize=(10,6))


df[df["收/支"]=="支出"].groupby("支出类型")["金额(元)"].sum().plot.pie(
    autopct="%1.1f%%", 
    colors=sns.color_palette("pastel")
)
plt.title("支出类型分布")
plt.ylabel("")
plt.savefig("支出分类占比.png")

# 消费时间分布（热力图）

plt.figure(figsize=(12,6))
hourly_data = df[df["收/支"]=="支出"].groupby("小时")["金额(元)"].sum().reset_index()
sns.barplot(x="小时", y="金额(元)", data=hourly_data, palette="Blues_d")
plt.title("每小时消费金额分布")
plt.savefig("消费时间分布.png")


#使用Jinja2模板引擎生成更专业的报告：
from jinja2 import Template
template = Template("""
您好，{{username}}：
您本月在{{top_category}}类别的支出占比最高（{{top_percent}}%），
其中{{hour_peak}}时段的消费金额达¥{{hour_amount}}。
""")
print(template.render(
    username="用户",
    top_category=category_stats.idxmax()[0],
    top_percent=round(category_stats.max()[0]/total_expense*100, 1),
    hour_peak=hourly_data.iloc[0]['小时'],
    hour_amount=hourly_data.iloc[0]['金额(元)']
))